package controllers.Administrador;

import java.util.Collection;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import services.ComunidadDeVecinosService;
import services.PresupuestoService;
import controllers.AbstractController;
import domain.ComunidadDeVecinos;
import domain.Presupuesto;
import forms.ComunidadDeVecinosForm;

@Controller
@RequestMapping("/presupuesto/administrador/")
public class PresupuestoAdministratorController extends AbstractController {
	@Autowired
	private ComunidadDeVecinosService comunidadDeVecinosService;

	@Autowired
	private PresupuestoService presupuestoService;

	public PresupuestoAdministratorController() {
		super();
	}

	// Listing methods
	@RequestMapping(value = "/notramitados", method = RequestMethod.GET)
	public ModelAndView noTramitados() {
		ModelAndView result;
		Collection<Presupuesto> presupuestos;

		presupuestos = presupuestoService.findPresupuestoServicio();

		result = new ModelAndView("presupuesto/list");
		result.addObject("requestURI",
				"presupuesto/administrador/notramitados.do");
		result.addObject("presupuestos", presupuestos);

		result.addObject("backURI", "/welcome/index.do");

		return result;
	}

	@RequestMapping(value = "/listPendientes", method = RequestMethod.GET)
	public ModelAndView list(@RequestParam int comunidadId) {
		ModelAndView result;
		Collection<Presupuesto> presupuestos;

		presupuestos = presupuestoService
				.findPresupuestosPendientesByComunidadDeVecinos(comunidadId);

		result = new ModelAndView("presupuesto/list");
		result.addObject("requestURI", "presupuesto/administrador/listPendientes.do");
		result.addObject("presupuestos", presupuestos);

		result.addObject("backURI", "/welcome/index.do");

		return result;
	}

	@RequestMapping(value = "/listTodos", method = RequestMethod.GET)
	public ModelAndView listTodos(@RequestParam int comunidadId) {
		ModelAndView result;
		Collection<Presupuesto> presupuestos;

		presupuestos = presupuestoService
				.findPresupuestosByComunidadDeVecinos(comunidadId);

		result = new ModelAndView("presupuesto/list");
		result.addObject("requestURI", "presupuesto/administrador/listTodos.do");
		result.addObject("presupuestos", presupuestos);

		result.addObject("backURI", "/welcome/index.do");

		return result;
	}

	@RequestMapping(value = "/index", method = RequestMethod.GET)
	public ModelAndView index() {
		ModelAndView result;
		Collection<ComunidadDeVecinos> comunidades;
		ComunidadDeVecinosForm comunidadForm;

		comunidadForm = new ComunidadDeVecinosForm();
		comunidades = comunidadDeVecinosService.findAll();

		result = new ModelAndView("presupuesto/index");
		result.addObject("requestURI", "presupuesto/administrador/index.do");
		result.addObject("comunidades", comunidades);
		result.addObject("comunidadForm", comunidadForm);

		result.addObject("backURI", "/welcome/index.do");

		return result;
	}

	@RequestMapping(value = "/index", method = RequestMethod.POST, params = "todos")
	public ModelAndView todos(ComunidadDeVecinosForm comunidadForm) {
		ModelAndView result;
		int comunidadId;
		Collection<Presupuesto> presupuestos;

		comunidadId = comunidadForm.getComunidadId();

		presupuestos = presupuestoService
				.findPresupuestosByComunidadDeVecinos(comunidadId);

		result = new ModelAndView("presupuesto/list");

		result.addObject("requestURI", "presupuesto/administrador/listTodos.do");
		result.addObject("presupuestos", presupuestos);

		result.addObject("backURI", "/welcome/index.do");

		return result;
	}

	@RequestMapping(value = "/index", method = RequestMethod.POST, params = "pendientes")
	public ModelAndView pendientes(ComunidadDeVecinosForm comunidadForm) {
		ModelAndView result;
		int comunidadId;
		Collection<Presupuesto> presupuestos;

		comunidadId = comunidadForm.getComunidadId();

		presupuestos = presupuestoService
				.findPresupuestosPendientesByComunidadDeVecinos(comunidadId);

		result = new ModelAndView("presupuesto/list");

		result.addObject("requestURI", "presupuesto/administrador/listPendientes.do");
		result.addObject("presupuestos", presupuestos);

		result.addObject("backURI", "/welcome/index.do");

		return result;
	}

	@RequestMapping(value = "/create", method = RequestMethod.GET)
	public ModelAndView create() {
		ModelAndView result;
		Presupuesto presupuesto;
		Boolean editable;

		presupuesto = presupuestoService.create();
		editable = true;

		result = new ModelAndView("presupuesto/create");
		result.addObject("requestURI", "presupuesto/administrador/create.do");
		result.addObject("presupuesto", presupuesto);
		result.addObject("editable", editable);

		result.addObject("backURI", "/welcome/index.do");

		return result;
	}

	@RequestMapping(value = "/create", method = RequestMethod.POST, params = "save")
	public ModelAndView createSave(@Valid Presupuesto presupuesto,
			BindingResult binding) {
		ModelAndView result;

		if (binding.hasErrors()) {
			result = createEditModelAndView(presupuesto);
		} else {
			try {

				presupuestoService.save(presupuesto);
				result = new ModelAndView("redirect:../../");
			} catch (Throwable oops) {

				result = createEditModelAndView(presupuesto,
						"presupuesto.commit.error");
			}
		}

		return result;
	}

	@RequestMapping(value = "/edit", method = RequestMethod.GET)
	public ModelAndView edit(@RequestParam int presupuestoId) {
		ModelAndView result;
		Presupuesto presupuesto;
		Boolean editable;

		editable = true;
		presupuesto = presupuestoService.findOne(presupuestoId);
		if (presupuesto.getEstado().equals("Aceptado")
				|| presupuesto.getEstado().equals("No aceptado")) {
			editable = false;
		}

		result = new ModelAndView("presupuesto/edit");
		result.addObject("requestURI", "presupuesto/administrador/create.do");
		result.addObject("presupuesto", presupuesto);
		result.addObject("editable", editable);

		result.addObject("backURI", "/welcome/index.do");

		return result;
	}

	// Ancillary methods
	protected ModelAndView createEditModelAndView(Presupuesto presupuesto) {
		ModelAndView result;

		result = createEditModelAndView(presupuesto, null);

		return result;
	}

	protected ModelAndView createEditModelAndView(Presupuesto presupuesto,
			String message) {
		ModelAndView result;
		Boolean editable;

		editable = true;
		result = new ModelAndView("presupuesto/edit");
		if (presupuesto.getEstado().equals("Aceptado")
				|| presupuesto.getEstado().equals("No aceptado")) {
			editable = false;
		}
		if (presupuesto.getId() == 0) {
			editable = true;
		}

		result.addObject("presupuesto", presupuesto);
		result.addObject("editable", editable);
		result.addObject("message", message);

		return result;
	}
}
